// Copyright (C) 2015 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-array.from
description: Error setting property on result value (traversed via iterator)
info: |
    [...]
    6. If usingIterator is not undefined, then
       [...]
       g. Repeat
          [...]
          ix. Let defineStatus be CreateDataPropertyOrThrow(A, Pk,
              mappedValue).
          x. If defineStatus is an abrupt completion, return
             IteratorClose(iterator, defineStatus).
features: [Symbol.iterator]
---*/
function Test() {
  var constructorSetsIndex0ConfigurableFalse = function() {
    Object.defineProperty(this, '0', {
      writable: true,
      configurable: false
    });
  };
  var closeCount = 0;
  var items = {};
  var nextResult = {
    done: false
  };

  items[Symbol.iterator] = function() {
    return {
      return: function() {
        closeCount += 1;
      },
      next: function() {
        var result = nextResult;

        nextResult = {
          done: true
        };

        return result;
      }
    };
  };

  assert.throws(TypeError, function() {
    Array.from.call(constructorSetsIndex0ConfigurableFalse, items);
  }, 'Array.from.call(constructorSetsIndex0ConfigurableFalse, items) throws a TypeError exception');

  assert.sameValue(closeCount, 1, 'The value of closeCount is expected to be 1');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
  Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
  Test();
}